# <动手学习深度学习> 2.3

# 标量由只有一个元素的张量表示

import torch

# 实例化两个标量，
x = torch.tensor(3.0)
y = torch.tensor(2.0)
print('标量相乘:', x * y)

# 向量可以被视为标量值组成的列表。
# 这些标量值被称为向量的元素（element）或分量（component）
x = torch.arange(12, dtype=torch.float32)
print(x)

# 矩阵
x = x.reshape(3, 4)
print(x)
# 降维求和
print('x.sum():', x.sum())
# 沿0轴降维以生成输出向量，因此输入轴0的维数在输出形状中消失
print(x.sum(dim=0))
print('x.mean(): ', x.mean())  # 求平均值,要求元素是浮点型的
# 不降维求和
print('x.sum():', x.sum(dim=1, keepdim=True))
print('---矩阵转置---')
print(x.T)

print('----张量----')
# 向量是一阶张量，矩阵是二阶张量
x = x.reshape(2, 2, 3)
print(x, '\nshape: ', x.shape)
# 张量x有三个维度,3个轴,shape里的2对应axis0,2对应axis1,3对应axis2
print(f'{x.dim()=}')

print('---- 点积 (向量相乘)----')
a = torch.arange(5)
b = a
print(f'{torch.dot(a,b)=}')

print('----内积----')
a = torch.arange(20, dtype=torch.int32).reshape(5, 4)
b = torch.ones(4, 3, dtype=torch.int32)
print(f'{a=}\n{b=}')
print(f'{torch.mm(a,b)=}')

print('---- 向量Hadamard积----')
# 正确示例：相同shape的向量
aa = torch.tensor([1, 2, 3, 4]).reshape(2,-1)
bb = torch.tensor([4, 5, 6, 7]).reshape(2,-1)
print(f'{aa * bb = }')
